home *** CD-ROM | disk | FTP | other *** search
- #include "pz.h"
- #include "smalliff.h"
-
- /* IFF2PCS, main() and various other routines...
- ** IFF2PCS (c)1987 Ali T. Ozer
- ** Nov 1987
- */
- struct Library *IntuitionBase, *GfxBase, *LayersBase;
-
- PicInfoStruct pic;
- struct Screen *scr0;
- struct FileHandle *fp, *ParseArgs ();
-
- int runningfromcli;
-
- extern struct Menu pzmenu;
- int textcolor, bordercolor, normcolor, nonzerocolor;
- int puzpn, puzdepth; /* These are the parameters for a piece */
- int picx, picy; /* Where the picture is */
- int picw, pich; /* The size of the picture */
-
- struct BitMap picbm; /* All plane pointers start as NULL */
-
- /* Panic puts up a requester with a single "Sigh..." box. The string
- ** provided in "reason" is printed in the body of the requester.
- ** If user hits "Retry," then Panic returns. Else it exits.
- */
- void Panic (reason)
- UBYTE *reason;
- {
- static struct IntuiText negtxt = {0,1,COMPLEMENT,4,4,NULL,(UBYTE *)"Sigh...",NULL};
- static struct IntuiText bodytxt = {0,1,COMPLEMENT,10,6,NULL,NULL,NULL};
-
- if (reason) {
- if (runningfromcli == true) puts (reason);
- else {
- bodytxt.IText = reason;
- WBenchToFront ();
- if (AutoRequest (NULL, &bodytxt, NULL, &negtxt, 0L, 0L,
- (long)(Max(Min(strlen(reason)*10+50,625),200)),
- 54L) == TRUE) return;
- }
- };
- CleanUp ();
- exit (5);
- }
-
-
- CleanUp ()
- {
- FreePzMenu ();
-
- FreeBM (&picbm);
-
- if (pic.rawsource) FreeMem (pic.rawsource, pic.rawsourcesize);
-
- if (scr0) {
- if (scr0->FirstWindow) {
- /*if (scr0->FirstWindow->MenuStrip) ClearMenuStrip (scr0->FirstWindow);*/
- CloseWindow (scr0->FirstWindow); /* Assume only 1 */
- };
- CloseScreen (scr0);
- };
-
- if (LayersBase) CloseLibrary (LayersBase);
- if (GfxBase) CloseLibrary (GfxBase);
- if (IntuitionBase) CloseLibrary (IntuitionBase);
- }
-
- int Min ();
- int Max ();
-
- struct TextAttr NormalFontDesc = {(STRPTR)"topaz.font", 8, 0, 0};
-
- struct Screen *OpenPictureScreen (pic, borderpen, detailpen)
- PicInfoStruct *pic;
- int borderpen, detailpen;
- {
- struct NewScreen ns;
- struct NewWindow nw;
-
- setmem (&ns, sizeof(ns), 0);
- setmem (&nw, sizeof(nw), 0);
-
- ns.DefaultTitle = (UBYTE *)PROGNAME;
- ns.Font = &NormalFontDesc;
- ns.Width = nw.Width =
- ((struct GfxBase *)GfxBase)->NormalDisplayColumns; /* pic->bmhd.w; */
- ns.Height = nw.Height =
- ((struct GfxBase *)GfxBase)->NormalDisplayRows * 2; /* pic->bmhd.h; */
- ns.DetailPen = nw.DetailPen = detailpen;
- ns.BlockPen = nw.BlockPen = borderpen;
- ns.Depth = pic->bmhd.nPlanes;
- ns.Type = nw.Type = CUSTOMSCREEN;
- nw.Flags = SMART_REFRESH | BORDERLESS | BACKDROP | RMBTRAP | ACTIVATE;
- nw.IDCMPFlags = MOUSEBUTTONS | MOUSEMOVE | GADGETUP /*| MENUPICK*/;
- ns.ViewModes = HIRES | LACE; /* pic->viewmodes; */
- if (nw.Screen = OpenScreen (&ns)) {
- if (OpenWindow (&nw)) return (nw.Screen);
- else CloseScreen (nw.Screen);
- } else { /* Try with a smaller screen and see if we can open that. */
- ns.Width = nw.Width = 640;
- ns.Height = nw.Height = 400;
- if (nw.Screen = OpenScreen (&ns)) {
- if (OpenWindow (&nw)) return (nw.Screen);
- else CloseScreen (nw.Screen);
- }
- }
- return (NULL);
- }
-
- /* Macros to extract the color components from a 12-bit RGB color value */
- #define RED(c) ((c & 0x0F00) >> 8)
- #define GREEN(c) ((c & 0x00F0) >> 4)
- #define BLUE(c) (c & 0x000F)
-
- /* Follows the 11% Blue, 30% Red, 59% Green rule, returns a number 0..15 */
- UWORD RGBtoGray (c)
- UWORD c;
- {
- return (((RED(c) * 77) + (GREEN(c) * 151) + (BLUE(c) * 28)) >> 4);
- }
-
-
- FindColors (cmap, numcolors)
- UWORD *cmap;
- int numcolors;
- {
- int fdiff = -1, cdiff = 256, ndiff = -1; /* Differences for various colors */
- int cnt, cur, color0;
-
- textcolor = 0;
- bordercolor = 1;
- normcolor = -1;
- if (numcolors > 2) {
- color0 = RGBtoGray (cmap[0]);
- for (cnt = 1; cnt < numcolors; cnt++) {
- cur = RGBtoGray (cmap[cnt]) - color0;
- cur = (cur < 0 ? -cur : cur);
- if (cur > fdiff) {fdiff = cur; textcolor = cnt;};
- if (cur > ndiff && cur < 150) {ndiff = cur; normcolor = cnt;};
- if (cur < cdiff && cur > color0+15) {cdiff = cur; bordercolor = cnt;};
- }
- }
- if (normcolor == -1) normcolor = textcolor;
- else textcolor = normcolor;
- if (textcolor == bordercolor) textcolor = 0;
- if (normcolor == bordercolor) normcolor = 0;
- if (textcolor == 0) nonzerocolor = bordercolor; else nonzerocolor = textcolor;
- }
-
- extern struct WBStartup *WBenchMsg;
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- int scrw, scrh, scrd, scrc, cnt;
-
- runningfromcli = (argc == 0 ? false : true);
-
- if ((!(IntuitionBase = OpenLibrary ("intuition.library", 0L))) ||
- (!(GfxBase = OpenLibrary ("graphics.library", 0L))) ||
- (!(LayersBase = OpenLibrary ("layers.library", 0L)))) Panic ("No libs!");
-
- InitRnd (); /* Initialize the random number generator */
-
- if ((fp = ParseArgs (argc, argv, WBenchMsg)) == NULL)
- Panic ("Could not open file");
-
- if (ReadILBM (fp, &pic) == false) {
- Close (fp);
- Panic ("File error - Maybe not IFF?");
- };
- Close (fp);
-
- scrw = pic.bmhd.w; /* Screen width in BITS */
- scrh = pic.bmhd.h; /* Screen height in SCANLINES */
- scrd = pic.bmhd.nPlanes; /* Screen depth in BIT PLANES */
- scrc = pic.colorcount; /* Screen colors in # of REGISTERS */
-
- /*printf ("Scrw %d Scrh %d Scrd %d Scrc %d\n", scrw, scrh, scrd, scrc);*/
-
- /*if ((scrw > 352) || (scrh > 235)) Panic ("Need a LO-RES picture");*/
-
- if (scrd > 4) Panic ("Ack! No more than 16 colors!");
- if (scrw < 64 || scrh < 64) Panic ("Picture too small");
-
- /* Create a bitmap, expand the picture, and get rid of the compressed pic.
- */
-
- if (InitBM (&picbm, scrh, scrw, scrd) == false) Panic ("No memory for picture");
-
- Expand (&picbm, &(pic.bmhd), pic.rawsource);
-
- FreeMem (pic.rawsource, pic.rawsourcesize);
- pic.rawsource = NULL;
-
- FindColors (&(pic.colortable), 1 << scrd);
-
- if ((scr0 = OpenPictureScreen (&pic, bordercolor, normcolor)) == NULL)
- Panic ("No memory for screen");
- LoadRGB4 (&(scr0->ViewPort), &(pic.colortable), (LONG)scrc);
-
- /* For now, FORCE some values... */
- puzdepth = scrd;
- picx = 8;
- picy = 16;
- pich = Min (scrh, scr0->Height-picy-180);
- picw = Min (scrw, scr0->Width-picx*2);
-
- /* A word on colors: Globally,
- ** normcolor is used for text (different than background, but not much)
- ** textcolor is used for bright stuff (highlights)
- ** bordercolor is slightly different than background
- */
-
- if (InitPzMenu (scrd, normcolor, normcolor, bordercolor) == false)
- Panic ("No memory for menu");
-
- GetAndHandleEvents (scr0->FirstWindow);
-
- CleanUp ();
-
- }
-
-